package br.com.foxinline.servico.ep;

import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.modelo.ep.Testamento;
import br.com.foxinline.servico.ServicoGenerico;
import br.com.foxinline.utilitario.Caracteres;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class TestamentoServico extends ServicoGenerico<Testamento> {

    public TestamentoServico() {
        super(Testamento.class);
    }

    public List<Testamento> pesquisar(Testamento testamento) {
        String sql = "select testamento from Testamento testamento where testamento.ativo = true";

        if (testamento.getNumero() != null && !testamento.getNumero().isEmpty()) {
            sql += " and testamento.numero like '%" + testamento.getNumero() + "%'";
        }

        if (testamento.getAtoTipoEP() != null) {
            sql += " and testamento.atoTipoEP = :tipo";
        }

        if (testamento.getDataTestamento() != null) {
            sql += " and testamento.dataTestamento = :data";
        }

        if (testamento.getLivro() != null && !testamento.getLivro().isEmpty()) {
            sql += " and testamento.livro like '%" + testamento.getLivro() + "%'";
        }

        if (testamento.getLivroComplemento() != null && !testamento.getLivroComplemento().isEmpty()) {
            sql += " and testamento.livroComplemento like '%" + testamento.getLivroComplemento() + "%'";
        }

        if (testamento.getFolha() != null && !testamento.getFolha().isEmpty()) {
            sql += " and testamento.folha like '%" + testamento.getFolha() + "%'";
        }

        if (testamento.getFolhaComplemento() != null && !testamento.getFolhaComplemento().isEmpty()) {
            sql += " and testamento.folhaComplemento like '%" + testamento.getFolhaComplemento() + "%'";
        }

        if (testamento.getTestador().getCpf() != null && !testamento.getTestador().getCpf().isEmpty()) {
            sql += " and testamento.testador.cpf like '%" + Caracteres.removecaracter(testamento.getTestador().getCpf()) + "%'";
        }

        if (testamento.getTestador().getNome() != null && !testamento.getTestador().getNome().isEmpty()) {
            sql += " and lower(testamento.testador.nome) like '%" + testamento.getTestador().getNome().toLowerCase() + "%'";
        }

        if (testamento.getTestador().getRg() != null && !testamento.getTestador().getRg().isEmpty()) {
            sql += " and testamento.testador.rg like '%" + testamento.getTestador().getRg() + "%'";
        }

        if (testamento.getTestador().getOrgaoEmissor() != null && !testamento.getTestador().getOrgaoEmissor().isEmpty()) {
            sql += " and testamento.testador.orgaoEmissor like '%" + testamento.getTestador().getOrgaoEmissor() + "%'";
        }

        if (testamento.getTestador().getRne() != null && !testamento.getTestador().getRne().isEmpty()) {
            sql += " and testamento.testador.rne like '%" + testamento.getTestador().getRne() + "%'";
        }

        if (testamento.getTestador().getOutros() != null && !testamento.getTestador().getOutros().isEmpty()) {
            sql += " and testamento.testador.outros like '%" + testamento.getTestador().getOutros() + "%'";
        }

        Query query = getEntityManager().createQuery(sql);

        if (testamento.getAtoTipoEP() != null) {
            query.setParameter("tipo", testamento.getAtoTipoEP());
        }

        if (testamento.getDataTestamento() != null) {
            query.setParameter("data", testamento.getDataTestamento());
        }

        return query.getResultList();
    }

    public List<SeloEP> obterSelos(Testamento testamento) {

        String sql = "select testamento.selosEP from Testamento testamento where testamento.ativo = true and testamento = :testamento";

        Query query = getEntityManager().createQuery(sql);

        if (testamento != null && testamento.getId() != null) {
            query.setParameter("testamento", testamento);
        }

        return query.getResultList();
    }

    public List<Anexo> obterAnexos(Testamento testamento) {
        String sql = "select testamento.anexos from Testamento testamento where testamento.ativo = true and testamento = :testamento";

        Query query = getEntityManager().createQuery(sql);

        if (testamento.getId() != null) {
            query.setParameter("testamento", testamento);
        }

        return query.getResultList();
    }

    public List<Testamento> obterTestamentos(Date dataInicial, Date dataFinal) {
        String sql = "select testamento from Testamento testamento where testamento.ativo = true  and testamento.dataCadastro between :dataInicial and :dataFinal";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("dataInicial", dataInicial);
        query.setParameter("dataFinal", dataFinal);

        return query.getResultList();
    }

    public void exportarCENSEC(Date dataInicial, Date dataFinal) throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader("/home/cadomeireles/Development/FoxInLine/projects/Notario/Notario-ejb/src/java/br/com/foxinline/utilitario/RCTO_layout.xml"));

        DateFormat fileNameDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        
        List<Testamento> testamentos = obterTestamentos(dataInicial, dataFinal);

        String fileName = String.format("CENSEC_RCTO_%s_%s_(%s).xml", fileNameDateFormat.format(dataInicial), fileNameDateFormat.format(dataFinal), testamentos.size());

        BufferedWriter file = new BufferedWriter(new FileWriter(new File("/home/cadomeireles/Development/FoxInLine/Docs/Notário/CENSEC/" + fileName)));

        String line;

        while ((line = reader.readLine()) != null) {
            file.write(line + "\n");
        }

        StringBuilder texto = new StringBuilder();

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        Pattern pattern = Pattern.compile("(\\D*$)");

        for (Testamento testamento : testamentos) {
            texto.append("\t<Testamento>\n");

            texto.append("\t\t<TipoTestamento>").append(testamento.getAtoTipoEP().getCodigo()).append("</TipoTestamento>\n");

            texto.append("\t\t<Nome>").append(testamento.getTestador().getNome()).append("</Nome>\n");

            texto.append("\t\t<DataNascimento>").append(dateFormat.format(testamento.getTestador().getDataNascimento())).append("</DataNascimento>\n");

            String tipoDocumento = "";
            String documento = "";
            String documentoComplemento = "";
            
            if (testamento.getTestador().getRg() != null && !testamento.getTestador().getRg().isEmpty()) {

                tipoDocumento = "RG";
                documento = Caracteres.removecaracter(testamento.getTestador().getRg());
                documentoComplemento = testamento.getTestador().getOrgaoEmissor();

            } else if (testamento.getTestador().getRne() != null && !testamento.getTestador().getRne().isEmpty()) {

                tipoDocumento = "RNE";
                documento = testamento.getTestador().getRne();

            } else if (testamento.getTestador().getOutros() != null && !testamento.getTestador().getOutros().isEmpty()) {

                tipoDocumento = "OUTROS";
                documentoComplemento = testamento.getTestador().getOutros();

            }

            texto.append("\t\t<TipoDocumento>").append(tipoDocumento).append("</TipoDocumento>\n");

            texto.append("\t\t<Documento>").append(documento).append("</Documento>\n");

            texto.append("\t\t<DocumentoComplemento>").append(documentoComplemento).append("</DocumentoComplemento>\n");            
            
            texto.append("\t\t<CPF>").append(Caracteres.removecaracter(testamento.getTestador().getCpf())).append("</CPF>\n");

            texto.append("\t\t<NomeMae>").append(testamento.getTestador().getNomeMae()).append("</NomeMae>\n");

            String nomePai = "";
            if (testamento.getTestador().getNomePai() != null && !testamento.getTestador().getNomePai().isEmpty()) {
                nomePai = testamento.getTestador().getNomePai();
            }
            texto.append("\t\t<NomePai>").append(nomePai).append("</NomePai>\n");

            texto.append("\t\t<DataTestamento>").append(dateFormat.format(testamento.getDataTestamento())).append("</DataTestamento>\n");

            texto.append("\t\t<Livro>").append(testamento.getLivro()).append("</Livro>\n");

            String livroComplemento = "";
            if (testamento.getLivroComplemento() != null  && !testamento.getLivroComplemento().isEmpty()) {
                Matcher matcherLivroReferenteComplemento = pattern.matcher(testamento.getLivroComplemento());
                if (matcherLivroReferenteComplemento.find()) {
                    livroComplemento = matcherLivroReferenteComplemento.group();
                }
            }

            texto.append("\t\t<LivroComplemento>").append(livroComplemento).append("</LivroComplemento>\n");

            texto.append("\t\t<Folha>").append(testamento.getFolha()).append("</Folha>\n");

            String folhaComplemento = "";
            if (testamento.getFolhaComplemento() != null && !testamento.getFolhaComplemento().isEmpty()) {
                Matcher matcherFolhaReferenteComplemento = pattern.matcher(testamento.getFolhaComplemento());
                if (matcherFolhaReferenteComplemento.find()) {
                    folhaComplemento = matcherFolhaReferenteComplemento.group();
                }
            }

            texto.append("\t\t<FolhaComplemento>").append(folhaComplemento).append("</FolhaComplemento>\n");

            String observacoes = "";
            if (testamento.getObservacao() != null && !testamento.getObservacao().isEmpty()) {
                observacoes = testamento.getObservacao();
            }
            texto.append("\t\t<Observacoes>").append(observacoes).append("</Observacoes>\n");                  
            
            String revogacaoUF = "";
            String revogacaoCidade = "";
            if (testamento.getCidadeRevogacao() != null) {
                revogacaoUF = testamento.getCidadeRevogacao().getEstado().getSigla();
                revogacaoCidade = testamento.getCidadeRevogacao().getCodigoIbge();
            }
            texto.append("\t\t<RevogacaoUF>").append(revogacaoUF).append("</RevogacaoUF>\n");                  
            texto.append("\t\t<RevogacaoCidade>").append(revogacaoCidade).append("</RevogacaoCidade>\n");                  

            String revogacaoCartorio = "";
            if (testamento.getCartorioRevogacao() != null && !testamento.getCartorioRevogacao().isEmpty()) {
                revogacaoCartorio = testamento.getCartorioRevogacao();
            }
            texto.append("\t\t<RevogacaoCartorio>").append(revogacaoCartorio).append("</RevogacaoCartorio>\n");                  

            String revogacaoLivro = "";
            if (testamento.getLivroRevogacao() != null && !testamento.getLivroRevogacao().isEmpty()) {
                revogacaoLivro = testamento.getLivroRevogacao();
            }
            texto.append("\t\t<RevogacaoLivro>").append(revogacaoLivro).append("</RevogacaoLivro>\n");                  

            String livroComplementoRevogacao = "";
            if (testamento.getLivroComplementoRevogacao() != null && !testamento.getLivroComplementoRevogacao().isEmpty()) {
                Matcher matcherLivroComplementoRevogacao = pattern.matcher(testamento.getLivroComplementoRevogacao());
                if (matcherLivroComplementoRevogacao.find()) {
                    livroComplementoRevogacao = matcherLivroComplementoRevogacao.group();
                }
            }
            texto.append("\t\t<RevogacaoLivroComplemento>").append(livroComplementoRevogacao).append("</RevogacaoLivroComplemento>\n");                  

            String revogacaoFolha = "";
            if (testamento.getFolhaRevogacao() != null && !testamento.getFolhaRevogacao().isEmpty()) {
                revogacaoFolha = testamento.getFolhaRevogacao();
            }
            texto.append("\t\t<RevogacaoFolha>").append(revogacaoFolha).append("</RevogacaoFolha>\n");                  

            String folhaComplementoRevogacao = "";
            if (testamento.getFolhaComplementoRevogacao() != null && !testamento.getFolhaComplementoRevogacao().isEmpty()) {
                Matcher matcherFolhaComplementoRevogacao = pattern.matcher(testamento.getFolhaComplementoRevogacao());
                if (matcherFolhaComplementoRevogacao.find()) {
                    folhaComplementoRevogacao = matcherFolhaComplementoRevogacao.group();
                }
            }
            texto.append("\t\t<RevogacaoFolhaComplemento>").append(folhaComplementoRevogacao).append("</RevogacaoFolhaComplemento>\n");                  

            String revogacaoDataTestamento = "";
            if (testamento.getDataRevogacaoTestamento() != null) {
                revogacaoDataTestamento = dateFormat.format(testamento.getDataRevogacaoTestamento());
            }
            texto.append("\t\t<RevogacaoDataTestamento>").append(revogacaoDataTestamento).append("</RevogacaoDataTestamento>\n");                  

            String desconhecidoOutros = "";                  
            if (testamento.getDesconhecido() != null && !testamento.getDesconhecido().isEmpty()) {
                desconhecidoOutros = testamento.getDesconhecido();
            }
            texto.append("\t\t<DesconhecidoOutros>").append(desconhecidoOutros).append("</DesconhecidoOutros>\n");

            texto.append("\t</Testamento>\n");
        }

        texto.append("</NewDataSet>");

        file.write(texto.toString());

        reader.close();
        file.close();

    }
}